package com.zxj.shop.back.interceptor;

import java.net.URLEncoder;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.zxj.shop.common.util.ConstatfinalUtil;
import com.zxj.shop.common.util.HttpUtil;
import com.zxj.shop.users.pojo.AAdmins;
import com.zxj.shop.users.service.IUsersService;

@Component("loginAuthInterceptor")
public class LoginAuthInterceptor  extends HandlerInterceptorAdapter
{

	@Resource
	private IUsersService usersService;
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
	{
		ConstatfinalUtil.LOGGER.info("----商城登陆验证----");
		HttpSession session=request.getSession();
		/*从session中获取admins对象（从用户中心获取的管理员JSON对象）*/
		AAdmins admins=(AAdmins) session.getAttribute("admins");
        if(admins!=null)
        {
        	/*已经登陆---放行*/
        	return true;
        }
        
        /*---------------步骤3-------------*/
        /*第一次登陆跳转和登陆成功后跳转，唯一不一样的是token，客户端是否需要跳
         * 转到用户中心登陆页面的标志就是：token*/
        String token=request.getParameter("token");
        /*取最后一个token*/
        /*String[] tokens=request.getParameterValues("token");
        token=tokens[tokens.length-1];*/
        ConstatfinalUtil.LOGGER.info("----token:{}----",token);
        
        /*验证Token的合法性*/
        String requestURL=ConstatfinalUtil.BUNDLE.getString("users.center.validatorTokenUrl");
        HttpUtil httpUtil=new HttpUtil();
        /* 拼装JSON,验证token需要的JSON */
		/* {"version":"1","data":{"token":"40639117-f3fd-4151-bbdb-c47fb54623bf"}}
		 * */
        JSONObject requestJSON=new JSONObject();
        requestJSON.put("version", 1);
        JSONObject dataJSON=new JSONObject();
        dataJSON.put("token", token);
        requestJSON.put("data", dataJSON);
        
        try
		{
			Map<String,String> paramsMap =new HashMap<String,String>();
			paramsMap.put("json", requestJSON+"");
			String responseStr=httpUtil.methodPost(requestURL,Collections.EMPTY_MAP , paramsMap);
			ConstatfinalUtil.LOGGER.info("-验证-token：{}-",responseStr);
			JSONObject responseJSON=(JSONObject) JSON.parse(responseStr);
			/*处理token*/
			if("0".equalsIgnoreCase(responseJSON.getString("code")))
			{
				/*成功*/
				JSONObject dataResJSON=responseJSON.getJSONObject("data");
				if(dataResJSON.get("admins")!=null)
				{
					/*将token对应的管理员信息放到session*/
					JSONObject adminsJSON=(JSONObject) dataResJSON.get("admins");
					adminsJSON.put("token", token);
					/* 从session中取数据,存储到数据库中 */
					/* 将JSON转换为管理员对象 */
					
					/* 如果是第一次登陆,就new一个对象,如果是第二次登陆,从数据库查询吧
					 * 二话不说,先查询数据库
					 *  */
					Map<String,Object> condMap=new HashMap<String,Object>();
					/* 从用户中心返回的JSON中取id,也就是商城中管理员的ssoId */
					condMap.put("ssoId", adminsJSON.get("id"));
					admins=this.usersService.findOneAdminsService(condMap);
					/*一开始,先默认为更新*/
					boolean updateFlag=true;
					if(admins==null)
					{
						admins=new AAdmins();
						admins.setCreateTime(new Date());
						/*在改成false，要插入*/
						updateFlag=false;
					}
					admins=admins.parseObject(adminsJSON);
					/*只有上次登录时间有用*/
					admins.setUpdateTime(new Date());
					if(updateFlag)
					{
						this.usersService.updateOneAdminsService(admins);
					}else
					{
						/*存储数据库*/
						this.usersService.saveOneAdminsService(admins);
					}
					session.setAttribute("admins", admins);
					 return true;
				}
			}
		} catch (Exception e)
		{
		}
        /*----------步骤:1------------*/
        /*获取returnURL:当前即将访问的url*/
        String returnUrl=request.getRequestURL()+"";
        /*获取？后面的内容*/
        String queryStr=request.getQueryString();
        if(queryStr==null)
        {
        	queryStr="";
        }
        /*拼接returnurl*/
        if(queryStr.length()>0)
        {
        	returnUrl=returnUrl+"?"+queryStr;
        }
        ConstatfinalUtil.LOGGER.info("-----currurl:{}--queryStr:{}",returnUrl,queryStr);
        /*跳转到用户中心的登陆页面，并且将returnurl带上去*/
        String usersCenterLoginUrl=ConstatfinalUtil.BUNDLE.getString("users.center.loginUrl") + "&returnUrl=" + URLEncoder.encode(returnUrl, "UTF-8") ;;
        ConstatfinalUtil.LOGGER.info("--usersCenterLoginUrl:{}",usersCenterLoginUrl);
		/* 客户端跳转 */
		response.sendRedirect(usersCenterLoginUrl);
		return false;
	}

}
